#! /usr/bin/env python3
#GPIO按键控制LED (轮询方法)
# 导入必要的GPIO和时间库
import RPi.GPIO as GPIO
import time

# 设置GPIO编号模式为BCM（使用GPIO编号而board编号）
GPIO.setmode(GPIO.BCM)

# 定义LED和按钮的GPIO引脚
led = 21    # LED连接到GPIO21
bt = 20     # 按钮连接到GPIO20

# 初始化GPIO引脚模式
GPIO.setup(led, GPIO.OUT)     # 设置LED引脚为输出模式
# 设置按钮引脚为输入模式，并启用内部上拉电阻（默认高电平，按下时接地变低电平），防止引脚值因干扰飘动
GPIO.setup(bt, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# 初始化LED状态变量（True时点亮）
ledStatus = True

def my_callback(channel):
    """按钮按下中断函数"""
    print("Button pressed")#按下时打印按下的信息
    global ledStatus  #全局变量灯的状态
    
    # 切换LED状态
    ledStatus = not ledStatus  
    
    # 根据新状态控制LED
    if ledStatus:
        GPIO.output(led, GPIO.HIGH)#新状态为True时设置高电平点亮
    else:
        GPIO.output(led, GPIO.LOW)#新状态为False时设置低电平熄灭

# 设置按钮检测（下降沿触发，200ms防止开关按下后电平突变而暂时不多次响应）
GPIO.add_event_detect(bt, GPIO.FALLING, callback=my_callback, bouncetime=200)

try:#使用try，能够用Ctrl+C的方法中止While循环，执行cleanup清理GPIO.setup()的配置后退出
    # 主循环（每2秒打印一次信息）
    while True:
        print("I LOVE Raspberry Pi")
        time.sleep(2)#休眠2秒

except KeyboardInterrupt:
    # 当捕获到Ctrl+C时退出
    pass

# 清理GPIO资源
GPIO.cleanup()